package com.gitee.cnlongdb.basic.utils;

import java.io.File;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.gitee.cnlongdb.basic.constant.LongDbConstant;

/**
 * 系统名称：GenerateSequenceUtils.java
 * 模块名称：
 * 模块描述：全局唯一值生成器
 * 功能列表：
 * 模块作者：ZOUYONG
 * 开发时间：2018年12月5日 下午9:46:01
 * 模块路径：com.gitee.cnlongdb.basic.utils.GenerateSequenceUtils
 * 更新记录：
 */
public class GenerateSequenceUtils {

	private static final Logger logger = (Logger) LoggerFactory.getLogger(GenerateSequenceUtils.class);
	
	/**
	 * 功能描述：生成longdb数据库ID值
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月17日 下午8:22:43
	 * 更新记录：
	 * 返回数据：String
	 */
	public static String generateSequenceLongId() {
		/**
		 * longId-生成规则
		 * 1. 年月日时分秒 共14位
		 * 2. 随机数10位
		 *    总共24位数字
		 */
		StringBuffer longId = new StringBuffer();
		longId.append(LongDbConstant.generFormatTwo.format(new Date()))
			.append(RandomUtil.getCharAndNumr(10));
		
		return longId.toString();
	}

	/**
	 * 功能描述：执行生成ID的操作
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月17日 下午4:23:09
	 * 更新记录：
	 * 返回数据：LongTableEntity
	 */
	public static String execuGenerSequenceId(Long longId, Long range) {
		
		Long position = longId / range;
		if(longId % range != 0) {
			position = longId / range + 1;
		}
		/**
		 * 生成ID的规则如下：
		 * 1、8位的时间戳
		 * 2、8位的随机数
		 * 3、8位数据位置码
		 * 4、8位的内存递增值
		 */
		StringBuffer longIdStr = new StringBuffer();
		longIdStr.append(RandomUtil.getUnixTimeStamp())	// 8位的时间戳
			.append(RandomUtil.getCharAndNumr(8))		// 8位的随机数
			.append(position).append(RandomUtil.getRandomChar(8 - position.toString().length()))	// 8位数据位置码
			.append(longId).append(RandomUtil.getRandomChar(8 - longId.toString().length())) 		// 8位内存递增值
		;

		return longIdStr.toString();
	}

	/**
	 * 功能描述：获取longId中位置码
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月21日 下午11:10:50
	 * 更新记录：
	 * 返回数据：String[]
	 */
	public static Integer getLongDataOrder(String longId) {
		if(StringUtils.isBlank(longId)) {
			return null;
		}
		String endStr = longId.substring(0, 10);
		StringBuffer range = new StringBuffer();
		for (int i=0; i<endStr.length(); i++) {
			String str = Character.valueOf(endStr.charAt(i)).toString();
			if(NumberHandlerUtils.isNumber(str)) {
				range.append(str);
			} else {
				break;
			}
		}
		return StringUtils.isBlank(range.toString()) ? null : Integer.valueOf(range.toString());
	}

	/**
	 * 功能描述：根据ID反向生成数据所处的目录结构
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月17日 下午9:27:55
	 * 更新记录：
	 * 返回数据：String[]
	 */
	public static String[] getLongDataRootIds(String longId) {
		if(StringUtils.isBlank(longId)) {
			return null;
		}
		String[] longIds = new String[3];
		String idStr = longId.substring(0, 14);
		longIds[0] = idStr.substring(0, 4);
		longIds[1] = idStr.substring(4, 8);
		longIds[2] = idStr.substring(8, 14);
		return longIds;
	}

	/**
	 * 功能描述：根据文件名称，获取文件路径
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月22日 上午9:49:28	
	 × 返回数据：String
	 */
	public static String analysisFileName(String fileName) {
		StringBuffer filePath = new StringBuffer();
		filePath
			.append(fileName.substring(0, 4)).append(File.separator) // 年
			.append(fileName.substring(4, 6)).append(File.separator) // 月
			.append(fileName.substring(6, 8)).append(File.separator) // 日
			.append(fileName)
		;
		return filePath.toString();
	}
	
	/**
	 * 功能描述：根据文件名称，获取年月日
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月22日 上午10:48:54
	 × 返回数据：String[]
	 */
	public static String[] getArrayByFileName(String fileName) {
		String[] arry = new String[3];
		arry[0] = fileName.substring(0, 4);
		arry[1] = fileName.substring(4, 6);
		arry[2] = fileName.substring(6, 8);
		return arry;
	}
	
}
